use BankTest
go
create function function_sum()
returns money
as
begin
declare @Moneysum money =(select sum(CardMoney)  from BankCard)

return @Moneysum
end
go
select dbo.function_sum() as 和
drop function function_sum

--（2）传入账户编号，返回账户真实姓名

select * from AccountInfo
go
create function func_getName(@id int)
returns varchar(50)
as
begin
	declare @name varchar(50) = (select RealName from AccountInfo where AccountId = @id)
	return @name
end
go
select dbo.func_getName(1) 姓名

--（3）传递开始时间和结束时间，返回交易记录（存钱取钱），交易记录中包含 真实姓名，卡号，存钱金额，取钱金额，交易时间。

--方案一（逻辑复杂，函数内容除了返回结果的sql语句还有其他内容，例如定义变量等）：
go
create function getTransfer(@openTime smalldatetime)
returns @trans table(
	RealName varchar(50),
	CardNo varchar(50),
	MoneyInBank money,
	MoneyOutBank money,
	ExchangeTime smalldatetime
)
as 
begin
	insert into @trans
	select RealName,c.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime from CardExchange c 
	join BankCard b on b.CardNo = c.CardNo
	join AccountInfo a on a.AccountId = b.AccountId
	where ExchangeTime = @openTime
	group by RealName,c.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime
	return 
end
go
select * from getTransfer('2022-09-20 18:36:00')

--（4）查询银行卡信息，将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”，根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户"，分别显示卡号，身份证，姓名，余额，用户等级，银行卡状态。

--方案一：直接在sql语句中使用case when

--方案二：将等级和状态用函数实现
go
create function func_getMessage(@state int,@money money)
returns @message table(
	CardNo varchar(50),
	CardState int,
	state varchar(50),
	CardMoney money,
	lv varchar(50)

)
as
begin
	declare @sta varchar(50)
	insert into @message
	select 
		CardNo,
		CardState,
		case
			when CardState = 1 then '正常'
			when CardState = 2 then '挂失'
			when CardState = 3 then '冻结'
			else '注销'
		end ,
		CardMoney ,
		case 
			when CardMoney < 300000 then '普通用户' 
			else 'VIP用户'
		end 
	from BankCard
	return
end
go
select * from func_getMessage(1,30)

--（5）编写函数，根据出生日期求年龄，年龄求实岁，例如：
create table Emp
(
	EmpId int primary key identity(1,2), --自动编号
	empName varchar(20), --姓名
	empSex varchar(4),   --性别
	empBirth smalldatetime --生日
)
insert into Emp(empName,empSex,empBirth) values('刘备','男','2008-5-8')
insert into Emp(empName,empSex,empBirth) values('关羽','男','1998-10-10')
insert into Emp(empName,empSex,empBirth) values('张飞','男','1999-7-5')
insert into Emp(empName,empSex,empBirth) values('赵云','男','2003-12-12')
insert into Emp(empName,empSex,empBirth) values('马超','男','2003-1-5')
insert into Emp(empName,empSex,empBirth) values('黄忠','男','1988-8-4')
insert into Emp(empName,empSex,empBirth) values('魏延','男','1998-5-2')
insert into Emp(empName,empSex,empBirth) values('简雍','男','1992-2-20')
insert into Emp(empName,empSex,empBirth) values('诸葛亮','男','1993-3-1')
insert into Emp(empName,empSex,empBirth) values('徐庶','男','1994-8-5')
--?		生日为2000-5-5，当前为2018-5-4，年龄为17岁
--?		生日为2000-5-5，当前为2018-5-6，年龄为18岁
go
select * from Emp
go
-- drop function func_getAge
create function func_getAge(@birth smalldatetime)
returns int
as 
begin
declare @age int 
if(GETDATE() > @birth)
begin
	set @age = year(getdate()) - year(@birth)
end
else
begin
	set @age = year(getdate()) - year(@birth) - 1
end

return @age
end
go

select dbo.func_getAge('2008-05-08 00:00:00') as 实岁